package com.buercorp.wangyu.core1.ch12.threads;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 多个线程同时操作同一个对象 买火车票的例子
 * 线程执行会有随机性 可能还没有执行打印就被抢了 会出现 重复 越界
 * 解决线程安全 同步代码块
 *
 * @author yibai
 */
public class ThreadTest7 implements Runnable {

    // static 修饰表示这个类所有的对象 都共享这个数据
    //票数 1~100
    static int ticketNums = 0;
    // 锁对象 一定要唯一
    static Object obj = new Object();
    static Lock lock = new ReentrantLock();
    Thread th = new Thread();

    @Override
    public void run() {
        while (true) {
            // 同步代码块 obj  ThreadTest4.class字节码class文件
//            synchronized (ThreadTest7.class) {
            // 加锁

            lock.lock();
            try {
                if (ticketNums < 100) {
                    //加一个延迟
                    try {

                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    ticketNums++; // 线程执行会有随机性 可能还没有执行 就被抢了 会出现 重复 越界
                    System.out.println(Thread.currentThread().getName() + "---->拿到了第" + ticketNums + "--票");
                } else {
                    break;
                }
            } catch (RuntimeException e) {
                throw new RuntimeException(e);
            } finally {
                // 释放锁
                lock.unlock();
            }
//            }
        }
    }

    public static void main(String[] args) {
        ThreadTest7 ticket1 = new ThreadTest7();
        ThreadTest7 ticket2 = new ThreadTest7();
        ThreadTest7 ticket3 = new ThreadTest7();
        new Thread(ticket1, "小明1").start();
        new Thread(ticket2, "小贾2").start();
        new Thread(ticket3, "小东3").start();
    }
}